package modeloCarmenSanDiego.persistencia;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.*;

import org.jdom2.*;
import org.jdom2.output.XMLOutputter;

import modeloCarmenSanDiego.Ciudad;
import modeloCarmenSanDiego.Ladron;
import modeloCarmenSanDiego.ObjetoRobado;
import modeloCarmenSanDiego.OrdenDeArresto;
import modeloCarmenSanDiego.Policia;
import modeloCarmenSanDiego.Reloj;
import modeloCarmenSanDiego.Sospechoso;
import modeloCarmenSanDiego.pistas.*;

public class GuardadorDeArchivos {

	public void guardarCiudades(List<Ciudad> ciudades, String nombreArchivoCiudadesGuardadas) {
		try {
			
			Element root = new Element("Ciudades");
			Document doc = new Document(root);
			
			for (Ciudad ciudad : ciudades){
				Element elementoCiudad = new Element("Ciudad");
	        	elementoCiudad.addContent(new Element("nombre").setText(ciudad.getNombre()));
	        	elementoCiudad.addContent(new Element("ObjetoPreciado").setText("")); //no hace falta serializar esto, lo pongo para que funcione el mismo cargar
	        	elementoCiudad.addContent(serializarPistas(ciudad.getCaracteristicas()));
	        	elementoCiudad.addContent(new Element("Latitud").setText( String.valueOf(ciudad.getParalelo()) ) );
	        	elementoCiudad.addContent(new Element("Longitud").setText( String.valueOf(ciudad.getMeridiano()) ) );
	        	
	        	root.addContent(elementoCiudad);
	        }
			Writer w = new OutputStreamWriter(new FileOutputStream(nombreArchivoCiudadesGuardadas), "UTF-8");
	        new XMLOutputter().output(doc, w);
	    } catch (IOException io) {
	    	System.out.println(io.getMessage());
	    }
	    
	}

	private Element serializarPistas( Map<DificultadDePista, Map<Tema, String>> caracteristicas) {
		Element elementoPistas = new Element("pistas");
		
		Element elementoPistasBandera = new Element("bandera"); 
		Element elementoPistasCultura = new Element("cultura");
		Element elementoPistasEconomia = new Element("economia");
		
		elementoPistasBandera.addContent(new Element("facil").setText(caracteristicas.get(DificultadDePista.FACIL).get(Tema.BANDERA)));
		elementoPistasBandera.addContent(new Element("intermedio").setText(caracteristicas.get(DificultadDePista.MEDIA).get(Tema.BANDERA)));
		elementoPistasBandera.addContent(new Element("dificil").setText(caracteristicas.get(DificultadDePista.DIFICIL).get(Tema.BANDERA)));
		elementoPistasCultura.addContent(new Element("facil").setText(caracteristicas.get(DificultadDePista.FACIL).get(Tema.CULTURA)));
		elementoPistasCultura.addContent(new Element("intermedio").setText(caracteristicas.get(DificultadDePista.MEDIA).get(Tema.CULTURA)));
		elementoPistasCultura.addContent(new Element("dificil").setText(caracteristicas.get(DificultadDePista.DIFICIL).get(Tema.CULTURA)));
		elementoPistasEconomia.addContent(new Element("facil").setText(caracteristicas.get(DificultadDePista.FACIL).get(Tema.ECONOMIA)));
		elementoPistasEconomia.addContent(new Element("intermedio").setText(caracteristicas.get(DificultadDePista.MEDIA).get(Tema.ECONOMIA)));
		elementoPistasEconomia.addContent(new Element("dificil").setText(caracteristicas.get(DificultadDePista.DIFICIL).get(Tema.ECONOMIA)));
		
		elementoPistas.addContent(elementoPistasBandera);
		elementoPistas.addContent(elementoPistasCultura);
		elementoPistas.addContent(elementoPistasEconomia);
		
		return elementoPistas;
	}


	public void guardarSospechosos(List<Sospechoso> sospechosos, String nombreArchivoSospechososGuardados) {
		try {
			
			Element root = new Element("Sospechosos");
			Document doc = new Document(root);
			
			for (Sospechoso sospechoso : sospechosos){
				Element elementoSospechoso = new Element("Sospechoso");
	        	elementoSospechoso.addContent(new Element("Nombre").setText(sospechoso.getNombre()));
	        	elementoSospechoso.addContent(new Element("Sexo").setText(shiftPrimeraLetra((sospechoso.getSexo()).name())));
	        	elementoSospechoso.addContent(new Element("Hobby").setText(shiftPrimeraLetra((sospechoso.getHobby()).name())));
	        	elementoSospechoso.addContent(new Element("Cabello").setText(shiftPrimeraLetra((sospechoso.getCabello()).name())));
	        	elementoSospechoso.addContent(new Element("Senia").setText(shiftPrimeraLetra((sospechoso.getSenia()).name())));
	        	elementoSospechoso.addContent(new Element("Vehiculo").setText(shiftPrimeraLetra((sospechoso.getVehiculo()).name())));
	        		        	
	        	root.addContent(elementoSospechoso);
	        }
			
			Writer w = new OutputStreamWriter(new FileOutputStream(nombreArchivoSospechososGuardados), "UTF-8");
	        new XMLOutputter().output(doc, w);
	        
	    } catch (IOException io) {
	    	System.out.println(io.getMessage());
	    }

	}
	
	public void guardarCaso(Policia policia, Ladron ladron, ObjetoRobado objetoRobado, String nombreArchivoCasoGuardado, Reloj reloj, OrdenDeArresto ordenDeArresto) {
		try {
			
			Element root = new Element("Caso");
			Document doc = new Document(root);
			
			Element elementoReloj = new Element("reloj");
	        elementoReloj.addContent(new Element("hora").setText(Integer.toString(reloj.getHorario())));
	        elementoReloj.addContent(new Element("dia").setText(Integer.toString(reloj.getDia())));
	        root.addContent(elementoReloj);
	        
	        Element nombreCiudad = new Element("nombreCiudad").setText(policia.getCiudadActual().getNombre());
	        Element cantArrestos = new Element("cantidadDeArrestos").setText(Integer.toString(policia.getCantidadDeArrestos()));
	        Element elementoPolicia = new Element("policia");
	        elementoPolicia.addContent(cantArrestos);
	        elementoPolicia.addContent(nombreCiudad);
	        root.addContent(elementoPolicia);
	        
	        Element elementoNombreDelObjetoRobado = new Element("nombre").setText(objetoRobado.getNombreDelObjeto());
	        Element elementoRobado = new Element("robado").addContent(elementoNombreDelObjetoRobado);
	        root.addContent(elementoRobado);
	        
	        Element elementoAcusado = new Element("acusado").setText(ordenDeArresto.getNombre());
	        root.addContent(elementoAcusado);
	        
	        Writer w = new OutputStreamWriter(new FileOutputStream(nombreArchivoCasoGuardado), "UTF-8");
	        new XMLOutputter().output(doc, w);
	        
	    } catch (IOException io) {
	    	System.out.println(io.getMessage());
	    }
	}

	private String shiftPrimeraLetra(String stringAModificar){
		String stringModificado = stringAModificar.toLowerCase();
		String mayuscula = stringModificado.charAt(0)+""; 
		mayuscula = mayuscula.toUpperCase(); 
		stringModificado = stringModificado.replaceFirst(stringModificado.charAt(0)+"", mayuscula);
		return stringModificado;
	}
	
	
}
